package com.datang.litejvm.cmd;

import com.datang.litejvm.constant.ConstantPool;
import com.datang.litejvm.engin.ExecutionResult;
import com.datang.litejvm.engin.StackFrame;

/**
 * @author 顶风少年
 * @date 2022/6/20
 */
public class GotoCmd extends TwoOperandCmd {

    public GotoCmd(ConstantPool pool, String opCode) {
        super(pool, opCode);
    }

    @Override
    public String toString() {
        return super.toString();
    }


    /**
     * @author: 顶风少年
     * @Description: 分支跳转
     * 无符号 byte 型数据 branchbyte1 和 branchbyte2 用于构建一个 16 位有
     * 符号的分支偏移量，构建方式为（branchbyte1 << 8）| branchbyte2。
     * 指令执行后，程序将会转到这个 goto 指令之后的，由上述偏移量确定的目标
     * 地址上继续执行。这个目标地址必须处于 goto 指令所在的方法之中。
     * @date: 11:43 2022/6/20
     **/
    @Override
    public void execute(StackFrame frame, ExecutionResult result) {
        int offsetFromStartCmd = this.getOffset() + getIndex();
        result.setNextAction(ExecutionResult.JUMP);
        result.setNextCmdOffset(offsetFromStartCmd);
    }
}
